package a_简单;

import leetcode.editor.cn.level.简单;
import 分类.二分查找;

import java.math.BigInteger;

/**
 * 给你一个正整数 num 。如果 num 是一个完全平方数，则返回 true ，否则返回 false 。
 * <p>
 * 完全平方数 是一个可以写成某个整数的平方的整数。换句话说，它可以写成某个整数和自身的乘积。
 * <p>
 * 不能使用任何内置的库函数，如  sqrt 。
 * <p>
 *  
 * <p>
 * 示例 1：
 * <p>
 * 输入：num = 16
 * 输出：true
 * 解释：返回 true ，因为 4 * 4 = 16 且 4 是一个整数。
 * 示例 2：
 * <p>
 * 输入：num = 14
 * 输出：false
 * 解释：返回 false ，因为 3.742 * 3.742 = 14 但 3.742 不是一个整数。
 *  
 * <p>
 * 提示：
 * <p>
 * 1 <= num <= 231 - 1
 * <p>
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode.cn/problems/valid-perfect-square
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 *
 * @author caihe
 * @date 2023/4/24 9:28
 */
public class _367_有效的完全平方数 implements 简单, 二分查找 {

    public static void main(String[] args) {
        new _367_有效的完全平方数().isPerfectSquare(808201);
    }

    public boolean isPerfectSquare(int num) {
        if (num == 0 || num == 1) {
            return true;
        }
        // 用二分遍历数字的一半
        long left = 1, right = num / 2;


        while (left <= right) {
            long mid = left + (right - left) / 2;
            if (BigInteger.valueOf(mid * mid).compareTo(BigInteger.valueOf(num)) > 0) {
                right = mid - 1;
            } else if (BigInteger.valueOf(mid * mid).compareTo(BigInteger.valueOf(num)) < 0) {
                left = mid + 1;
            } else {
                return true;
            }
        }
        return false;
    }

}
